#!/bin/bash

# 这个脚本用于配置和初始化 CAN 总线接口（CAN0 和 CAN1）
# CAN（Controller Area Network）是一种用于车载网络的通信协议
# 本脚本提供了多种配置选项，可以根据需要选择不同的配置方式

# 启用 shell 的调试模式，执行时会打印每条命令
set -x

# 首先关闭 CAN0 和 CAN1 接口，以便重新配置
ifconfig can0 down
ifconfig can1 down

# 以下是不同的 CAN 总线配置选项，根据需要取消注释使用

# 选项1：简单配置方式 - 250Kbps 波特率
# ip link set can0 type can bitrate 250000
# ip link set can1 type can bitrate 250000

# 选项2：高速配置方式 - 500Kbps 波特率
# ip link set can0 type can bitrate 500000
# ip link set can1 type can bitrate 500000

# 选项3：详细时序参数配置
# tq: 时间量子（Time Quantum）- 500ns
# prop-seg: 传播段长度 - 3 tq
# phase-seg1: 相位缓冲段1长度 - 3 tq
# phase-seg2: 相位缓冲段2长度 - 1 tq
# sjw: 同步跳转宽度 - 2 tq
#
# tq 计算公式：
# tq = 1 / (频率 × 预分频器值)
# 或者反向计算：
# 波特率 = 频率 / (预分频器值 × (1 + prop-seg + phase-seg1 + phase-seg2))
#
# 例如：如果 tq = 500ns，总段数 = 1(同步段) + 3(prop-seg) + 3(phase-seg1) + 1(phase-seg2) = 8
# 则一个位的总时间 = 8 × 500ns = 4000ns
# 波特率 = 1 / 4000ns = 250Kbps
# ip link set can0 up type can tq 500 prop-seg 3 phase-seg1 3 phase-seg2 1 sjw 2
# ip link set can1 up type can tq 500 prop-seg 3 phase-seg1 3 phase-seg2 1 sjw 2

# 选项4：带采样点的配置（250Kbps）
# sample-point: 采样点位置（0.75 表示在位时间的 75% 处采样）
#
# 采样点计算公式：
# 采样点 = (1 + prop-seg + phase-seg1) / (1 + prop-seg + phase-seg1 + phase-seg2)
#
# 例如：对于 prop-seg = 3, phase-seg1 = 3, phase-seg2 = 1
# 采样点 = (1 + 3 + 3) / (1 + 3 + 3 + 1) = 7/8 = 0.875 或 87.5%
#
# 注意：在实际配置中，采样点通常设置在 75%-87.5% 之间，
# 这是为了在信号传播延迟和噪声抑制之间取得平衡
# ip link set can0 up type can bitrate 250000 sample-point 0.75
# ip link set can1 up type can bitrate 250000 sample-point 0.75

# 当前使用的配置：250Kbps 波特率，采样点在 75%
# 这种配置适合大多数常见的 CAN 总线应用场景
#
# 注意：虽然使用上面的参数 (prop-seg=3, phase-seg1=3, phase-seg2=1) 计算得到的采样点是 87.5%，
# 但在实际应用中，我们选择了 75% 的采样点，这是因为：
# 1. 75% 是一个更为保守和通用的值，适用于更多种类的 CAN 网络
# 2. 较低的采样点值可以提供更好的噪声容忍度
# 3. 不同的 CAN 控制器可能有不同的内部时序参数实现
ip link set can0 up type can bitrate 250000 sample-point 0.75
ip link set can1 up type can bitrate 250000 sample-point 0.75

# 显示 CAN0 和 CAN1 接口的详细配置信息
# 用于验证配置是否正确应用
ip -details link show can0
ip -details link show can1


# + ip -details link show can0
# 4: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAU                                                                                 LT group default qlen 10
#     link/can  promiscuity 0 minmtu 0 maxmtu 0
#     can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 100
#           bitrate 250000 sample-point 0.750
#           tq 200 prop-seg 7 phase-seg1 7 phase-seg2 5 sjw 1
#           phytium_can: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..512 brp-inc 2
#           clock 600000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_                                                                                 max_segs 65535
# + ip -details link show can1
# 5: can1: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAU                                                                                 LT group default qlen 10
#     link/can  promiscuity 0 minmtu 0 maxmtu 0
#     can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 100
#           bitrate 250000 sample-point 0.750
#           tq 200 prop-seg 7 phase-seg1 7 phase-seg2 5 sjw 1
#           phytium_can: tseg1 1..16 tseg2 1..8 sjw 1..4 brp 1..512 brp-inc 2
#           clock 600000000 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_                                                                                 max_segs 65535
